/* 
 * 重载 
 * 1. 同一作用域 (函数的作用域名，由函数声明决定)
 * 2. 函数名相同
 * 3. 参数表不同
 *
 * */ 
#include <iostream>

using namespace std;

void foo(void)
{
	cout << "foo (void)" << endl;
}

void foo( int a)
{
	cout << "foo (int)" << endl;
}

void foo( int a, int b)
{
	cout << "foo (int, int)" << endl;
}

//void foo( int b, int a) {}  // xxx ,重载与参数名无关。不看参数名。

void foo( int a, double b)
{
	cout << "foo (int, double)" << endl;
}

//int foo( int a, double b){}  //  xxx  重载，与返回类型无关,只能表现在参数表不同.

namespace ns1 {

	void bar (int x)
	{
		cout << "ns1::bar(int)" << endl;
	}
}

namespace ns2 {

	void bar (double x)
	{
		cout << "ns2::bar(double)" << endl;
	}
}


int main(void)
{
	foo();
	foo(10);
	foo(10,1.23);
	void foo(int,int); // 函数声明，隐藏掉外部作用域，foo
	foo(10,1.23);
	//foo(10); // 编译出错
	//foo();   // 编译出错
	
	//
	using namespace ns1; //  名字空间指令
	using namespace ns2;

	bar(10);
	bar(1.23);

	using ns1::bar; // 名字空间声明, 
	bar(10);
	bar(1.23);

	using ns2::bar; //  恢复重载
	bar(10);
	bar(1.23);
	
	return 0;
}


